﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Security;
using System.Text;
using System.Xml.Linq;
using LimitatorInterfaces;
using GOCorrectionLoader;

namespace CorrectServices
{
    /// <summary>
    /// Реализация загрузки коррекций в размере ГО из БД
    /// </summary>
    public class GoLoadProvider : ILoadProvider
    {
        /// <summary>
        /// Загрузка массива коррекций из БД
        /// </summary>
        /// <param name="param">Параметр содержит массив KeyValuePair , 
        /// где должны присутствовать - Строка подключения к БД (LoadCorrectionsProviderParam_GO_connection), 
        /// SQL-запрос (LoadCorrectionsProviderParam_GO_query)</param>
        /// <returns>Массив объектов коррекций</returns>
        public object[] LoadFromSource(object param)
        {
            var resParam = CheckAndParceParam(param);

            List<object> result = new List<object>();

            using (SqlConnection conn = new SqlConnection(resParam.Item1))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = resParam.Item2;
                cmd.CommandType = System.Data.CommandType.Text;
                conn.Open();

                var reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    object[] row = { reader.GetSqlString(1).Value, reader.GetDecimal(2) };
                    result.Add(row);
                }

                reader.Close();
            }

            return result.ToArray();
        }

        private static Tuple<string, string> CheckAndParceParam(object param)
        {
            var serviceParam = param as KeyValuePair<string, string>[];

            if (serviceParam == null)
                throw new ArgumentException("param");

            var chekParam = serviceParam.Count(v => v.Key == Res.Сonnection || v.Key == Res.Query) == 2;

            if (!chekParam)
                throw new ArgumentException(
                    "Аргумент должен содержать строку соединения (LoadCorrectionsProviderParam_GO_connection) " +
                    "и sql-запрос (LoadCorrectionsProviderParam_GO_query)", "param");

            var connStr = serviceParam.Single(v => v.Key == Res.Сonnection).Value;
            var query = serviceParam.Single(v => v.Key == Res.Query).Value;

            if (string.IsNullOrWhiteSpace(connStr))
                throw new LoadProviderException("Нет строки подключения в наборе параметров");

            if (string.IsNullOrWhiteSpace(query))
                throw new LoadProviderException("Нет SQL-запроса в наборе параметров");

            Tuple<string, string> resParam = new Tuple<string, string>(connStr, query);
            return resParam;
        }
    }
}
